package com.itany.cloud.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.itany.cloud.global.GlobalException;
import com.itany.cloud.util.ResponseResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    // @SentinelResource用于自定义错误信息
    // 该注解所标注的方法必须使用public进行修饰
    // value属性:指定资源名称,即当前方法的访问地址
        // value属性的值不能以/开头
        // 例如:此处访问地址为/f1,则value的值为:f1
        // 如果当前方法没有设置访问地址,则value的值为空字符串
    // blockHandler:指定自定义的异常方法
        // 类似于局部异常处理,该方法是在当前Controller中的某一个方法
        // 异常处理方法返回值必须与当前方法保持一致
        // 且异常方法的参数必须是BlockException
    @SentinelResource(value = "f1",blockHandler = "handlerException")
    @RequestMapping("/f1")
    public ResponseResult f1(){
        return ResponseResult.success();
    }

    public ResponseResult handlerException(BlockException e){
        return ResponseResult.fail("Sentinel异常,异常为:"+e);
    }

    // blockHandlerClass属性:指定处理当前方法的Sentinel异常的类是哪一个
    // blockHandler属性:指定处理当前方法的Sentinel异常是指定类中的哪一个方法
    @SentinelResource(value = "f2",blockHandlerClass = GlobalException.class,blockHandler="handlerException")
    @RequestMapping("/f2")
    public ResponseResult f2(){
        return ResponseResult.success();
    }
}
